home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / games / spassion / source.lzh / SOURCE / FuncEnemy / ZAKO03.C < prev    next >
Text File  |  2000-03-20  |  3KB  |  128 lines

  1. /*
  2. #include <stdio.h>
  3. #include <iocslib.h>
  4. */
  5. /* 自機を追いかける */
  6. #include <xsp2lib.h>
  7. #include "../SPASSION.H"
  8. #include "../player.h"
  9. #include "../enemy.h"
  10. #include "../eshot.h"
  11. #include "../effect.h"
  12. #include "../priority.h"
  13. #include "../sound.h"
  14. #include "../entry.h"
  15. #include "../SUB.H"
  16. #ifndef NULL
  17. #define NULL ((void *) 0)
  18. #endif
  19.  
  20. #define PALET_MAIN    0x0500
  21.  
  22. short enemy_explode( ENEMY *ene );
  23. static short MoveEnemyZako03(ENEMY *);
  24. /*static void TiniEnemyZako03(ENEMY *);*/
  25.  
  26. #define P_X    (*((short *) (&player[0].lx)))    /*lxの上位ワード*/
  27. #define P_Y    (*((short *) (&player[0].ly)))    /*lyの上位ワード*/
  28.  
  29. #define PT_ST    0
  30. /* 16x16キャラの当たり判定 */
  31. extern HIT_XY4    hit8_p;
  32. extern HIT_XY4    hit8_o;
  33. extern HIT_XY4    hit8_s;
  34.  
  35. /* InitEnemyZako00Hitと同じなのでいらない */
  36. void InitEnemyZako03Hit( void )
  37. {
  38. }
  39.  
  40. void InitEnemyZako03(ENEMY *ene)
  41. {
  42.     if( ene->lx > (128+16)<<16 )
  43.         ene->vx             = -2 * 65536;
  44.     else
  45.         ene->vx             =  2 * 65536;
  46.     ene->vy             = 0;
  47.     ene->hit_p[0]     = &hit8_p;ene->hit_p[1]=NULL;
  48.     ene->hit_o[0]     = &hit8_o;ene->hit_o[1]=NULL;
  49.     ene->hit_s[0]     = &hit8_s;ene->hit_s[1]=NULL;
  50.     ene->hp             = 1;
  51.     if( ene->lx > (128+16)<<16 )
  52.         ene->angle         = 192;
  53.     else
  54.         ene->angle         = 64;
  55.     ene->no_dead     = 0;
  56.     ene->func_enemy_move = MoveEnemyZako03;
  57. /*    ene->func_enemy_tini = TiniEnemyZako03;*/
  58.  
  59. /*    entry_counter_stop = !0;*/        /* エントリーカウンター停止 */
  60. }
  61.  
  62.  
  63. static short MoveEnemyZako03( ENEMY *ene )
  64. {
  65.     short tmp;
  66.     unsigned char angle;
  67.  
  68.     if( (++ene->count > 4) && ene->state < 32 ) {        /* 4 回移動するごとに向き修正、32 回追いかけたら終わり */
  69.         tmp = calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y );
  70.  
  71.         tmp = (tmp - ene->angle) & (256 - 1);
  72.         if( tmp ) {
  73.             if (tmp > 127) ene->angle-=8 ;
  74.             else ene->angle+=8 ;
  75.             ene->angle &= 256 - 1;
  76.         }
  77.  
  78.         ene->vx = vx_tbl[6+ene->arg][ene->angle];
  79.         ene->vy = vy_tbl[6+ene->arg][ene->angle];
  80.         ene->count=0;
  81.         ene->state++;
  82.         if( ene->state==16 ){
  83.             switch ( level ){
  84.             case NOMAL:
  85.                 MakeEShot(ESHOT_ENG01, ENE_X, ENE_Y, 5, calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y ), 4,0,ene);
  86.                 SetSE(SE_ESHOT_ENRG);    /* 敵ショット音 */
  87.                 break;
  88.             case HARD:
  89.                 MakeEShot(ESHOT_ENG01, ENE_X, ENE_Y, 5, angle=calc_direction( ENE_X, ENE_Y, P_X+CENTER_X, P_Y ), 4,0,ene);
  90.                 MakeEShot(ESHOT_ENG01, ENE_X, ENE_Y, 5, (angle-12)&255, 4,0,ene);
  91.                 MakeEShot(ESHOT_ENG01, ENE_X, ENE_Y, 5, (angle+12)&255, 4,0,ene);
  92.                 SetSE(SE_ESHOT_ENRG);    /* 敵ショット音 */
  93.                 break;
  94.             }
  95.         }
  96.     }
  97.  
  98.     /* 速度を足して上位ワード(固定整数部)だけ取り出す */
  99.     ene->x = ((ene->lx += ene->vx) >> 16)-8;    /*-8は表示位置をずらすため*/
  100.     ene->y = ((ene->ly += ene->vy) >> 16)-8;
  101.  
  102.     if( ene->state >= 16 ) {
  103.         /* 画面外に出たら消去 */
  104.         if( ENE_X > 255 + 24 || ENE_Y < 16 - 8 || ENE_Y > 255 + 24 || ENE_Y < 16 - 8 )
  105.             return (0);
  106.     }
  107.     ene->pt = obj_zako_k+PT_ST + pt_rot[ene->angle];
  108.     ene->info = PALET_MAIN | PRIORITY_ZAKO | info_rot[ene->angle];
  109.  
  110.     /* ダメージを受けた時の処理 */
  111.     if(ene->damage){
  112.         MakeEffect(EFFECT_EXPLMINI, 0, ene->x, ene->y);
  113.         SetSE(SE_EXPL_S);    /* 爆発音 */
  114.         ene->player->score += 1;
  115.         return (0);        /* 消去 */
  116.     }
  117.  
  118.     xsp_set_st(ene);
  119.  
  120.     return(1);
  121. }
  122.  
  123. /*
  124. static void TiniEnemyZako03(ENEMY * p)
  125. {
  126. }
  127. */
  128.